home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Everything For A Hacker
/
19990506-[HACK].iso
/
SECURE
/
CRYPT
/
GOST.ZIP
/
SHOWGOST.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-18
|
5KB
|
175 lines
/*----------------------------------------------------
ShowGost.c - »α«úαá¼¼á ñ½∩ óδó«ñá «ΓτÑΓá « »α«µÑßßÑ
Φ¿Σα«óá¡¿∩ »« âÄæÆ 28147-89
----------------------------------------------------
(c) Copyright 1995 Ç¡ñαÑ⌐ ₧α∞Ñó¿τ é¿¡«¬πα«ó, î«ß¬óá
éÑαß¿∩ 1.00, 09.02.95
----------------------------------------------------
Åα«úαá¼¼á óδñáÑΓ «ΓτÑΓ « ß«ßΓ«∩¡¿∩σ αÑú¿ßΓα«ó ¼«ñÑ-
½¿ Φ¿Σα«óáΓѽ∩ »« âÄæÆ 28147-89. éßÑ »áαá¼ÑΓαδ Φ¿Σ-
α«óáΓѽ∩ ºáñáεΓß∩ »α«¿ºó«½∞¡«, τΓ«íδ éδ ¼«ú½¿ «ß¡«-
óáΓѽ∞¡« »«Ñ..Γ∞ á½ú«α¿Γ¼. ¥Γá »α«úαá¼¼á íπñÑΓ éá¼
«..¿Γѽ∞¡« »«½Ñº¡á »α¿ «Γ½áñ¬Ñ ¼«ñπ½Ñ⌐ âÄæÆá.
----------------------------------------------------
æ µÑ½∞ε ñ«ßΓ¿ªÑ¡¿∩ ¼á¬ß¿¼á½∞¡«⌐ »α«ßΓ«Γδ ñá¡¡á∩
»α«úαá¼¼á ß«ñÑαª¿Γ ½¿Φ∞ ¼¿¡¿¼á½∞¡δÑ »α«óÑન ¡á
¬«ααÑ¬Γ¡«ßΓ∞ óσ«ñ¡δσ ñá¡¡δσ.
----------------------------------------------------
*/
#include <ctype.h> // isspace
#include <io.h> // eof
#include <stdio.h> // FILE,scanf,printf,etc....
#include <stdlib.h> // strtoul,lrotl
#include <string.h> // strcpy,strlen
typedef struct
{
unsigned long low,high;
} CryptoBlock;
unsigned short KeyLength,KeyRepeat;
unsigned long Key[64];
unsigned short Cht[8][16];
char KeyUse[64+1];
CryptoBlock data;
void main(int argc,char **argv)
{
FILE *file;
unsigned i,j,k,l;
char *p;
unsigned long Old=0UL;
// óδñáτá ¬«»¿αá⌐Γá
printf(
"Åα«úαá¼¼á óδñáτ¿ »«ñα«í¡«ú« «ΓτÑΓá « »α«µÑßßÑ Φ¿Σα«óá¡¿∩ "
"»« âÄæÆ 28147-89\n"
"(c) Copyright 1995 Ç¡ñαÑ⌐ ₧α∞Ñó¿τ é¿¡«¬πα«ó, ú.î«ß¬óá\n\n"
);
if (argc<6)
{
printf(
"ö«α¼áΓ ¬«¼á¡ñ¡«⌐ ßΓ᫬¿ ºá»πß¬á »α«úαá¼¼δ ñ«½ªÑ¡ íδΓ∞ ß½ÑñπεΘ¿⌐ :\n"
"\"name ChangeTableFile KeyFile KeyUsingScheme N1 N2\", úñÑ :\n"
"name - ¿¼∩ Σá⌐½á ß »α«úαá¼¼«⌐;\n"
"ChangeTableFile - ¿¼∩ Σá⌐½á ß Γáí½¿µÑ⌐ ºá¼Ñ¡,"
" ºáñá¡¡«⌐ ó ΓѬßΓ«ó«⌐ Σ«α¼Ñ\n"
" Æç ñ«½ª¡á ß«ñÑαªáΓ∞ α«ó¡« 128 τ¿ßѽ «Γ 0 ñ« 255,\n"
" ºá»¿ßá¡¡δσ ó 16-α¿τ¡«⌐ ß¿ßΓÑ¼Ñ ßτ¿ß½Ñ¡¿∩;\n"
"KeyFile - ¿¼∩ Σá⌐½á ß ¬½ετ«¼, »αÑñßΓáó½Ñ¡¡δ¼"
" ó ß¿¼ó«½∞¡«⌐ Σ«α¼Ñ;\n"
" ¬½ετ ñ«½ªÑ¡ ß«ñÑαªáΓ∞ «Γ 1 ñ« 64 φ½Ñ¼Ñ¡Γ«ó"
" - ñ½¿¡¡δσ µÑ½δσ\n"
" íѺ º¡á¬á, ºá»¿ßá¡¡δσ ó 16-α¿τ¡«⌐ ß¿ßΓѼÑ;\n"
"KeyUsingScheme - ßΓα«¬á ¿º ß¿¼ó«½«ó 0 ¿ 1, "
"«ΓαáªáεΘá∩ »«α∩ñ«¬ ¿ß»«½∞º«óá¡¿∩\n"
" φ½Ñ¼Ñ¡Γ«ó ¬½ετá: 0-ó»ÑαÑñ, 1-¡áºáñ;\n"
"N1,N2 - ß««ΓóÑΓßΓóÑ¡¡« ¼½áñΦá∩ ¿ ßΓáαΦá∩ τáßΓ¿"
" Φ¿ΣαπѼ«ú« í½«¬á;\n"
" ñá¡¡δσ\n"
"\n"
);
return;
}
// τΓÑ¡¿Ñ Γáí½¿µδ ºá¼Ñ¡
if(!(file=fopen(argv[1],"rt")))
{
printf("ìÑ ¼«úπ «Γ¬αδΓ∞ Σá⌐½ Γáí½¿µδ ºá¼Ñ¡ - \"%s\"\n");
return;
}
for (i=0; i<8*16; i++)
{
fscanf(file,"%hx",Cht[0]+i);
/* if(eof(fileno(file)) || !isspace(getc(file)))
{
printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó« óσ«ñ¡«¼ »«Γ«¬Ñ\n");
return;
}
*/
}
fclose(file);
// τΓÑ¡¿Ñ ¬½ετá
if(!(file=fopen(argv[2],"rt")))
{
printf("ìÑ ¼«úπ «Γ¬αδΓ∞ Σá⌐½ ¬½ετá - \"%s\"\n");
return;
}
for (KeyLength=0; KeyLength<64; KeyLength++)
if (!(fscanf(file,"%lx",Key+KeyLength)==1))
break;
fclose(file);
// τΓÑ¡¿Ñ ßσÑ¼δ ¿ß»«½∞º«óá¡¿∩ ¬½ετá
if ((KeyRepeat=strlen(argv[3])) > 64)
{
printf("æΓ᫬á ßσÑ¼δ ¿ß»«½∞º«óá¡¿∩ ¬½ετá ß½¿Φ¬«¼ ñ½¿¡¡á∩\n");
return;
}
strcpy(KeyUse,argv[3]);
for (p=KeyUse; *p; p++)
{
if (*p != '0' && *p != '1')
{
printf("é ßσÑ¼Ñ ¿ß»«½∞º«óá¡¿∩ ¬½ετá ñ«»πßΓ¿¼δ Γ«½∞¬« 0 ¿ 1\n");
return;
}
}
// ñѬ«ñ¿α«óá¡¿Ñ ñá¡¡δσ ñ½∩ Φ¿Σα«óá¡¿∩
data.low=strtoul(argv[4],&p,16);
if (*p)
{
printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó ºá»¿ß¿ 16-α¿τ¡«ú« τ¿ß½á N1 - \"%c\"\n",
*p);
return;
}
data.high=strtoul(argv[5],&p,16);
if (*p)
{
printf("ìÑñ«»πßΓ¿¼δ⌐ ß¿¼ó«½ ó ºá»¿ß¿ 16-α¿τ¡«ú« τ¿ß½á N2 - \"%c\"\n",
*p);
return;
}
// ÉÑ὿ºáµ¿∩ á½ú«α¿Γ¼á Φ¿Σα«óá¡¿∩
// óδñáτá ºáú«½«ó¬á
printf(
"ÿ¿Σα«óá¡¿Ñ ñá¡¡δσ »« «í«íΘÑ¡¡«¼π á½ú«α¿Γ¼π âÄæÆ 28147-89\n"
"<i> <--N2--> <--N1--> <-K[i]-> <N1+Ki > <ºá¼Ñ¡á> "
"<óαáΘ11> <--N2\'-> <--N1\'->\n"
);
// «ßπΘÑßΓó½Ñ¡¿Ñ »α«µÑñπαδ ºáΦ¿Σα«óá¡¿∩
for (i=0,l=0; i<KeyRepeat; i++)
{
putchar('\n');
for (j=0; j<KeyLength; j++,l++)
{
Old=data.low;
k= (KeyUse[i]=='0') ? j : KeyLength-j-1;
printf ("%03u %08lx %08lx %08lx",
k,data.high,data.low,Key[k]);
data.low+=Key[k];
printf (" %08lx",data.low);
for (k=0; k<8; k++)
{
unsigned long L;
L=Cht[k][(unsigned)(data.low & 0x0000000FUL)];
data.low &= ~0x0000000FUL;
data.low |= L;
data.low = _lrotl(data.low,4);
}
printf (" %08lx",data.low);
data.low=_lrotl(data.low,11);
printf (" %08lx",data.low);
data.low ^= data.high;
data.high = Old;
printf (" %08lx %08lx\n",data.high,data.low);
}
}
printf("\n\n Result=%08lx%08lx",data.low,data.high);
}